package com.wyw.function.learning.demo5;

import java.util.stream.Stream;

/**
 * @Title   使用流
 * @Description
 * @Author Mr Wu yewen.wu.china@gmail.com
 * Update History:
 * Author        Time            Content
 */
public class DemoClient12 {
    // 从多个源创建流
    // 由值创建流，可以通过静态方法Stream.of，通过显示值创建一个流
//    public static void main(String[] args) {
//        Stream<Integer> integerStream = Stream.of(1, 2, 3, 4, 5, 6);
//        // 空流
//        Stream<String> empty = Stream.empty();
//        // 从数组创建流
//        int[] nums = {1,2,3,4,5,6};
//        IntStream stream = Arrays.stream(nums);
//        // 文件创建流
//        long lineWords = 0;
//        try{
//            Stream<String> lines = Files.lines(Paths.get("data.txt"), Charset.defaultCharset());
//            lineWords = lines.flatMap(line->Arrays.stream(line.split(""))).distinct().count();
//        } catch (Exception ex) {
//
//        }
//    }

    // 无限流
    // Stream API提供了两个静态方法从函数生成流：Stream.iterate 和 Stream.generate，一般来说limit(n)来对这种流加以限制，避免打印无穷多个值
    public static void main(String[] args) {
        // 迭代
//        Stream.iterate(0, n->n+2).limit(10).forEach(System.out::println);

        // 计算有限个斐波那契数列
        Stream.iterate(new int[] {0, 1}, t -> new int[] {t[1], t[0] + t[1]})
                .limit(20)
                .forEach(t-> System.out.println("(" + t[0] + " " + t[1] + ")"));

        // 生成    与iterate方法不同，不是每个新生成的值用函数，接收一个Supplier<T>类型的Lambda提供新的值
//        Stream.generate(Math::random).limit(5).forEach(System.out::println);


    }
}
